treeview: Use a cssnode instead of regions
authorBenjamin Otte <otte@redhat.com>
Sun, 6 Sep 2015 05:36:57 +0000 (07:36 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 22 Oct 2015 14:42:47 +0000 (16:42 +0200)
This makes Treeview headers work again like before region support was
removed.

gtk/gtktreeprivate.h
gtk/gtktreeview.c
gtk/gtktreeviewcolumn.c
gtk/theme/Adwaita/_common.scss
gtk/theme/Adwaita/gtk-contained-dark.css
gtk/theme/Adwaita/gtk-contained.css
gtk/theme/HighContrast/_common.scss
gtk/theme/HighContrast/gtk.css

index a2d6d6c80a728727d4822d27fc904fc42b399ad9..fa35a99205dcf0e7a5dbbbcde3a83286938e41ec 100644 (file)
@@ -142,7 +142,6 @@ void              _gtk_tree_view_column_push_padding          (GtkTreeViewColumn
 gint              _gtk_tree_view_column_get_requested_width   (GtkTreeViewColumn  *column);
 gint              _gtk_tree_view_column_get_drag_x            (GtkTreeViewColumn  *column);
 GtkCellAreaContext *_gtk_tree_view_column_get_context         (GtkTreeViewColumn  *column);
-void              _gtk_tree_view_reset_header_styles       (GtkTreeView        *tree_view);
 
 
 G_END_DECLS
index ecac8cf7b03b145cb111ef5209329e7b55544fb5..a9ba64760cae965c7d14358eace44b7e021042cf 100644 (file)
@@ -294,6 +294,9 @@ struct _GtkTreeViewPrivate
 
   GtkPixelCache *pixel_cache;
 
+  /* CSS nodes */
+  GtkCssNode *column_header_node;
+
   /* Scroll position state keeping */
   GtkTreeRowReference *top_row;
   gint top_row_dy;
@@ -588,8 +591,6 @@ static gboolean gtk_tree_view_enter_notify         (GtkWidget        *widget,
                                                    GdkEventCrossing *event);
 static gboolean gtk_tree_view_leave_notify         (GtkWidget        *widget,
                                                    GdkEventCrossing *event);
-static GtkWidgetPath * gtk_tree_view_get_path_for_child (GtkContainer *container,
-                                                         GtkWidget    *child);
 
 static void     gtk_tree_view_set_focus_child      (GtkContainer     *container,
                                                    GtkWidget        *child);
@@ -988,7 +989,6 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
   container_class->remove = gtk_tree_view_remove;
   container_class->forall = gtk_tree_view_forall;
   container_class->set_focus_child = gtk_tree_view_set_focus_child;
-  container_class->get_path_for_child = gtk_tree_view_get_path_for_child;
 
   class->move_cursor = gtk_tree_view_real_move_cursor;
   class->select_all = gtk_tree_view_real_select_all;
@@ -1758,6 +1758,7 @@ static void
 gtk_tree_view_init (GtkTreeView *tree_view)
 {
   GtkTreeViewPrivate *priv;
+  GtkCssNode *widget_node;
 
   priv = tree_view->priv = gtk_tree_view_get_instance_private (tree_view);
 
@@ -1820,6 +1821,13 @@ gtk_tree_view_init (GtkTreeView *tree_view)
   gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (tree_view)),
                                GTK_STYLE_CLASS_VIEW);
 
+  widget_node = gtk_widget_get_css_node (GTK_WIDGET (tree_view));
+  priv->column_header_node = gtk_css_node_new ();
+  gtk_css_node_set_name (priv->column_header_node, g_intern_string ("column-header"));
+  gtk_css_node_set_parent (priv->column_header_node, widget_node);
+  gtk_css_node_set_state (priv->column_header_node, gtk_css_node_get_state (widget_node));
+  g_object_unref (priv->column_header_node);
+
   priv->multipress_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (tree_view));
   gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->multipress_gesture), 0);
   g_signal_connect (priv->multipress_gesture, "pressed",
@@ -8716,67 +8724,6 @@ gtk_tree_view_set_focus_child (GtkContainer *container,
   GTK_CONTAINER_CLASS (gtk_tree_view_parent_class)->set_focus_child (container, child);
 }
 
-static GtkWidgetPath *
-gtk_tree_view_get_path_for_child (GtkContainer *container,
-                                  GtkWidget    *child)
-{
-  GtkTreeView *tree_view = GTK_TREE_VIEW (container);
-  GtkWidgetPath *path;
-  gboolean rtl;
-  GList *list, *visible_columns = NULL;
-  gint n_col = 0;
-
-  path = GTK_CONTAINER_CLASS (gtk_tree_view_parent_class)->get_path_for_child (container, child);
-  rtl = (gtk_widget_get_direction (GTK_WIDGET (container)) == GTK_TEXT_DIR_RTL);
-
-  for (list = tree_view->priv->columns; list; list = list->next)
-    {
-      GtkTreeViewColumn *column = list->data;
-
-      if (gtk_tree_view_column_get_visible (column))
-        visible_columns = g_list_prepend (visible_columns, column);
-      else if (gtk_tree_view_column_get_widget (column) == child ||
-               gtk_tree_view_column_get_button (column) == child)
-G_GNUC_BEGIN_IGNORE_DEPRECATIONS
-        gtk_widget_path_iter_add_region (path, gtk_widget_path_length (path) - 2, GTK_STYLE_REGION_COLUMN_HEADER, 0);
-G_GNUC_END_IGNORE_DEPRECATIONS
-    }
-
-  if (!rtl)
-    visible_columns = g_list_reverse (visible_columns);
-
-  for (list = visible_columns; list != NULL; list = list->next)
-    {
-      GtkTreeViewColumn *column = list->data;
-      GtkRegionFlags flags = 0;
-
-      n_col++;
-
-      if (gtk_tree_view_column_get_widget (column) != child &&
-          gtk_tree_view_column_get_button (column) != child)
-        continue;
-
-      if ((n_col % 2) == 0)
-        flags |= GTK_REGION_EVEN;
-      else
-        flags |= GTK_REGION_ODD;
-
-      if (n_col == 1)
-        flags |= GTK_REGION_FIRST;
-
-      if (!list->next)
-        flags |= GTK_REGION_LAST;
-
-G_GNUC_BEGIN_IGNORE_DEPRECATIONS
-      gtk_widget_path_iter_add_region (path, gtk_widget_path_length (path) - 2, GTK_STYLE_REGION_COLUMN_HEADER, flags);
-G_GNUC_END_IGNORE_DEPRECATIONS
-      break;
-    }
-  g_list_free (visible_columns);
-
-  return path;
-}
-
 static gboolean
 gtk_tree_view_real_move_cursor (GtkTreeView       *tree_view,
                                GtkMovementStep    step,
@@ -11964,29 +11911,6 @@ gtk_tree_view_append_column (GtkTreeView       *tree_view,
   return gtk_tree_view_insert_column (tree_view, column, -1);
 }
 
-void
-_gtk_tree_view_reset_header_styles (GtkTreeView *tree_view)
-{
-  GList *columns;
-
-  for (columns = tree_view->priv->columns; columns; columns = columns->next)
-    {
-      GtkTreeViewColumn *column = columns->data;
-      GtkWidget *header_widget;
-
-      if (!gtk_tree_view_column_get_visible (column))
-        continue;
-
-      header_widget = gtk_tree_view_column_get_widget (column);
-
-      if (!header_widget)
-        header_widget = gtk_tree_view_column_get_button (column);
-
-      _gtk_widget_invalidate_style_context (header_widget, GTK_CSS_CHANGE_PARENT_REGION);
-    }
-}
-
-
 /**
  * gtk_tree_view_remove_column:
  * @tree_view: A #GtkTreeView.
@@ -12054,7 +11978,6 @@ gtk_tree_view_remove_column (GtkTreeView       *tree_view,
       gtk_widget_queue_resize (GTK_WIDGET (tree_view));
     }
 
-  _gtk_tree_view_reset_header_styles (tree_view);
   _gtk_tree_view_accessible_remove_column (tree_view, column, position);
 
   g_object_unref (column);
@@ -12063,6 +11986,22 @@ gtk_tree_view_remove_column (GtkTreeView       *tree_view,
   return tree_view->priv->n_columns;
 }
 
+static void
+gtk_tree_view_update_button_position (GtkTreeView       *tree_view,
+                                      GtkTreeViewColumn *column)
+{
+  GtkTreeViewPrivate *priv = tree_view->priv;
+  GList *column_el;
+
+  column_el = g_list_find (priv->columns, column);
+  g_return_if_fail (column_el != NULL);
+
+  gtk_css_node_insert_after (priv->column_header_node,
+                             gtk_widget_get_css_node (gtk_tree_view_column_get_button (column)),
+                             column_el->prev ? gtk_widget_get_css_node (
+                                gtk_tree_view_column_get_button (column_el->prev->data)) : NULL);
+}
+
 /**
  * gtk_tree_view_insert_column:
  * @tree_view: A #GtkTreeView.
@@ -12110,6 +12049,8 @@ gtk_tree_view_insert_column (GtkTreeView       *tree_view,
 
   _gtk_tree_view_column_set_tree_view (column, tree_view);
 
+  gtk_tree_view_update_button_position (tree_view, column);
+
   if (gtk_widget_get_realized (GTK_WIDGET (tree_view)))
     {
       GList *list;
@@ -12125,8 +12066,6 @@ gtk_tree_view_insert_column (GtkTreeView       *tree_view,
       gtk_widget_queue_resize (GTK_WIDGET (tree_view));
     }
 
-  _gtk_tree_view_reset_header_styles (tree_view);
-
   _gtk_tree_view_accessible_add_column (tree_view, column, position);
 
   g_signal_emit (tree_view, tree_view_signals[COLUMNS_CHANGED], 0);
@@ -12338,14 +12277,14 @@ gtk_tree_view_move_column_after (GtkTreeView       *tree_view,
       base_el->next = column_list_el;
     }
 
+  gtk_tree_view_update_button_position (tree_view, column);
+
   if (gtk_widget_get_realized (GTK_WIDGET (tree_view)))
     {
       gtk_widget_queue_resize (GTK_WIDGET (tree_view));
       gtk_tree_view_size_allocate_columns (GTK_WIDGET (tree_view), NULL);
     }
 
-  _gtk_tree_view_reset_header_styles (tree_view);
-
   _gtk_tree_view_accessible_reorder_column (tree_view, column);
 
   g_signal_emit (tree_view, tree_view_signals[COLUMNS_CHANGED], 0);
index b56819d4ca539662b32801d1af0481e1aa1cd365..d5e9ae11094a9c397cac47df201c862999dcdcc8 100644 (file)
@@ -1890,7 +1890,6 @@ gtk_tree_view_column_set_visible (GtkTreeViewColumn *tree_column,
 
   if (priv->tree_view)
     {
-      _gtk_tree_view_reset_header_styles (GTK_TREE_VIEW (priv->tree_view));
       _gtk_tree_view_accessible_toggle_visibility (GTK_TREE_VIEW (priv->tree_view),
                                                    tree_column);
     }
index d4036a96a4b6285c718606e53c9c4f94e6641cb3..cdd1cce7e0255741668369d5dbb0ac77bcef7824 100644 (file)
@@ -1403,8 +1403,8 @@ column-header {
       @extend column-header.button.dnd;
     }
   }
-  &:last-child .button,
-  &:last-child .button:backdrop, // set :backdrop too or the border will be visibile there
+  & .button:last-child,
+  & .button:last-child:backdrop, // set :backdrop too or the border will be visibile there
   &:last-child.button,
   &:last-child.button:backdrop { //treeview-like derived widgets in Banshee and Evolution
     border-right-style: none;
index 5ed13aab28e570052a2cf637121335f8b0b32a11..3807d15eba5c14c9e1c2aaec4fa31e0409c6377c 100644 (file)
@@ -1882,9 +1882,9 @@ column-header .titlebar .button.titlebutton,
   .titlebar column-header .button.titlebutton:active {
     color: #eeeeec;
     transition: none; }
-column-header:last-child .button, column-header:last-child .header-bar .button.titlebutton, .header-bar column-header:last-child .button.titlebutton,
-column-header:last-child .titlebar .button.titlebutton,
-.titlebar column-header:last-child .button.titlebutton, column-header:last-child .button:backdrop, column-header:last-child.button, .header-bar column-header.button.titlebutton:last-child,
+column-header .button:last-child, column-header .header-bar .button.titlebutton:last-child, .header-bar column-header .button.titlebutton:last-child,
+column-header .titlebar .button.titlebutton:last-child,
+.titlebar column-header .button.titlebutton:last-child, column-header .button:last-child:backdrop, column-header:last-child.button, .header-bar column-header.button.titlebutton:last-child,
 .titlebar column-header.button.titlebutton:last-child, column-header:last-child.button:backdrop {
   border-right-style: none; }
 
index 08dfbb6e257bbcfd5b802ff7fa7d4d51925bce91..ef957950f8a68d68f987a418fed6669ea043e4e8 100644 (file)
@@ -1888,9 +1888,9 @@ column-header .titlebar .button.titlebutton,
   .titlebar column-header .button.titlebutton:active {
     color: #2e3436;
     transition: none; }
-column-header:last-child .button, column-header:last-child .header-bar .button.titlebutton, .header-bar column-header:last-child .button.titlebutton,
-column-header:last-child .titlebar .button.titlebutton,
-.titlebar column-header:last-child .button.titlebutton, column-header:last-child .button:backdrop, column-header:last-child.button, .header-bar column-header.button.titlebutton:last-child,
+column-header .button:last-child, column-header .header-bar .button.titlebutton:last-child, .header-bar column-header .button.titlebutton:last-child,
+column-header .titlebar .button.titlebutton:last-child,
+.titlebar column-header .button.titlebutton:last-child, column-header .button:last-child:backdrop, column-header:last-child.button, .header-bar column-header.button.titlebutton:last-child,
 .titlebar column-header.button.titlebutton:last-child, column-header:last-child.button:backdrop {
   border-right-style: none; }
 
index 1867dd0ba372b5d2b236b8c7da5e048196a26ccb..edd97638893793305a52c207ce6ef12613075112 100644 (file)
@@ -1072,7 +1072,7 @@ column-header {
       color: $selected_fg_color;
     }
   }
-  &:last-child .button,
+  & :last-child.button,
   &:last-child.button { //treeview-like derived widgets in Banshee and Evolution
     border-right-style: none;
   }
index 733de696962c6cc9a3b6ecb2cf7e41418e3078d4..af2b81a43375b1c1ac1dca1478e96f73737c9ef3 100644 (file)
@@ -1268,7 +1268,7 @@ column-header .button {
     box-shadow: none; }
   column-header .button:active {
     color: #fff; }
-column-header:last-child .button, column-header:last-child.button {
+column-header :last-child.button, column-header:last-child.button {
   border-right-style: none; }
 
 column-header .button, column-header .button:hover, column-header .button:active {